﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using MakeIT.MiraPark.Negocios;

namespace MiraPark
{
    public partial class FormCadastroHorario : Form
    {
        private string operacao = "";

        public FormCadastroHorario()
        {
            InitializeComponent();
        }

        private void FormCadastroHorario_Load(object sender, EventArgs e)
        {
            //Popular a lista de horarios cadastrados
            this.dataGridViewHorarios.DataSource = ModelBO.getHorarios();
            this.comboBoxTipoPeriodo.DataSource = TipoPeriodoVO.getTipoPeriodos();

            setupButtonsControls();
        }

        private void dataGridViewHorario_SelectionChanged(object sender, EventArgs e)
        {
            setupButtonsControls();
        }

        private void buttonNovo_Click(object sender, EventArgs e)
        {
            this.operacao = "novo";
            setupButtonsControls();
        }

        private void buttonCancelar_Click(object sender, EventArgs e)
        {
            this.operacao = "cancelar";
            setupButtonsControls();
        }

        private void buttonEditar_Click(object sender, EventArgs e)
        {
            this.operacao = "editar";
            setupButtonsControls();
        }

        private void buttonExcluir_Click(object sender, EventArgs e)
        {
            List<HorarioVO> horarioList = (List<HorarioVO>)this.dataGridViewHorarios.DataSource;
            HorarioVO horario = horarioList[this.dataGridViewHorarios.CurrentRow.Index];

            if (!ModelBO.readyToDeleteHorario(horario.idHorario))
            {
                MessageBox.Show(this, "Horário não pode ser excluído pois já está associado a Tabela de preços", "Aviso");
                return;
            }

            this.operacao = "excluir";

            DialogResult dr = MessageBox.Show(this, "Confirma a exclusão do horario " + horario.controle, "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (dr.ToString().Equals("Yes"))
            {
                ModelBO.delHorario(horario);

                int nRow = this.dataGridViewHorarios.CurrentRow.Index;
                this.dataGridViewHorarios.DataSource = ModelBO.getHorarios();
                if (this.dataGridViewHorarios.Rows.Count > 0)
                {
                    dataGridViewHorarios.CurrentCell = dataGridViewHorarios.Rows[Math.Min(nRow, this.dataGridViewHorarios.Rows.Count - 1)].Cells[1];
                    dataGridViewHorarios.Rows[Math.Min(nRow, this.dataGridViewHorarios.Rows.Count - 1)].Selected = true;
                }

                setupButtonsControls();
            }
        }

        private void buttonSalvar_Click(object sender, EventArgs e)
        {
            String erros = "";
            if (this.textBoxControle.Text.Trim().Length == 0)
                erros = erros + "Controle deve ser informado.\r\n";
            if (this.comboBoxTipoPeriodo.SelectedItem==null)
                erros = erros + "Tipo de Periodo deve ser informado.\r\n";
            if (erros.Length > 0)
            {
                MessageBox.Show(this, erros, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            
            if (this.dateTimePickerHoraInicial.Value > this.dateTimePickerHoraFinal.Value)
                erros = erros + "Horário inicial MAIOR que horário final.\r\n";
            if (this.dateTimePickerHoraInicialDiaria.Value > this.dateTimePickerHoraFinalDiaria.Value)
                erros = erros + "Horário inicial MAIOR que horário final. (Diária)\r\n";
            if (this.dateTimePickerHoraInicialSab.Value > this.dateTimePickerHoraFinalSab.Value)
                erros = erros + "Horário inicial MAIOR que horário final. (Sabado)\r\n";
            if (this.dateTimePickerHoraInicialDom.Value > this.dateTimePickerHoraFinalDom.Value)
                erros = erros + "Horário inicial MAIOR que horário final. (Domingo)\r\n";

            if (erros.Length > 0)
            {
                DialogResult dr = MessageBox.Show(this, erros + "\r\nConfirma? ", "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (dr.ToString().Equals("No"))
                    return;
            }

            HorarioVO horario = null;

            if (this.operacao.Equals("novo"))
            {

                horario = HorarioVO.CreateHorarioVO();
                horario.controle = this.textBoxControle.Text;
                horario.tipoPeriodo = ((TipoPeriodoVO)this.comboBoxTipoPeriodo.SelectedItem).idTipoPeriodo;
                horario.horaInicial = this.dateTimePickerHoraInicial.Value.TimeOfDay;
                horario.horaFinal = this.dateTimePickerHoraFinal.Value.TimeOfDay;
                horario.horaInicialDiaria = this.dateTimePickerHoraInicialDiaria.Value.TimeOfDay;
                horario.horaFinalDiaria = this.dateTimePickerHoraFinalDiaria.Value.TimeOfDay;
                horario.horaInicialSab = this.dateTimePickerHoraInicialSab.Value.TimeOfDay;
                horario.horaFinalSab = this.dateTimePickerHoraFinalSab.Value.TimeOfDay;
                horario.horaInicialDom = this.dateTimePickerHoraInicialDom.Value.TimeOfDay;
                horario.horaFinalDom = this.dateTimePickerHoraFinalDom.Value.TimeOfDay;

                horario.idHorario = (int)ModelBO.newHorario(horario);
            }
            if (this.operacao.Equals("editar"))
            {
                List<HorarioVO> horarioList = (List<HorarioVO>)this.dataGridViewHorarios.DataSource;
                horario = horarioList[this.dataGridViewHorarios.CurrentRow.Index];

                if (!horario.tipoPeriodo.Equals(((TipoPeriodoVO)this.comboBoxTipoPeriodo.SelectedItem).idTipoPeriodo)
                    && !ModelBO.readyToDeleteHorario(horario.idHorario))
                {
                    MessageBox.Show(this, "Tipo de período não pode modificado.\r\n Este horário já está associado a Tabela de preços", "Aviso");
                    return;
                }

                horario.controle = this.textBoxControle.Text;
                horario.tipoPeriodo = ((TipoPeriodoVO)this.comboBoxTipoPeriodo.SelectedItem).idTipoPeriodo;
                horario.horaInicial = this.dateTimePickerHoraInicial.Value.TimeOfDay;
                horario.horaFinal = this.dateTimePickerHoraFinal.Value.TimeOfDay;
                horario.horaInicialDiaria = this.dateTimePickerHoraInicialDiaria.Value.TimeOfDay;
                horario.horaFinalDiaria = this.dateTimePickerHoraFinalDiaria.Value.TimeOfDay;
                horario.horaInicialSab = this.dateTimePickerHoraInicialSab.Value.TimeOfDay;
                horario.horaFinalSab = this.dateTimePickerHoraFinalSab.Value.TimeOfDay;
                horario.horaInicialDom = this.dateTimePickerHoraInicialDom.Value.TimeOfDay;
                horario.horaFinalDom = this.dateTimePickerHoraFinalDom.Value.TimeOfDay;

                ModelBO.setHorario(horario);
            }
            this.operacao = "salvar";

            List<HorarioVO> listHorarioVOs = ModelBO.getHorarios();
            dataGridViewHorarios.DataSource = listHorarioVOs;
            int nRow = listHorarioVOs.FindIndex(a => a.idHorario == horario.idHorario);
            dataGridViewHorarios.CurrentCell = dataGridViewHorarios.Rows[nRow].Cells[1];
            dataGridViewHorarios.Rows[nRow].Selected = true;

            setupButtonsControls();
        }

        private void setupButtonsControls()
        {
            bool haRows = this.dataGridViewHorarios.Rows.Count > 0 && this.dataGridViewHorarios.CurrentRow!=null;
            bool novo = this.operacao.Equals("novo");
            bool edit = this.operacao.Equals("editar");
            bool canc = this.operacao.Equals("cancelar");

            this.buttonCancelar.Enabled = novo || edit;
            this.buttonNovo.Enabled = !novo && !edit;
            this.buttonEditar.Enabled = haRows && !novo && !edit;
            this.buttonExcluir.Enabled = haRows && !novo && !edit;
            this.buttonSalvar.Enabled = novo || edit;

            this.textBoxControle.Enabled = novo || edit;
            this.comboBoxTipoPeriodo.Enabled = novo || edit;
            this.dateTimePickerHoraInicial.Enabled = novo || edit;
            this.dateTimePickerHoraFinal.Enabled = novo || edit;
            this.dateTimePickerHoraInicial.Enabled = novo || edit;
            this.dateTimePickerHoraFinal.Enabled = novo || edit;
            this.dateTimePickerHoraInicialDiaria.Enabled = novo || edit;
            this.dateTimePickerHoraFinalDiaria.Enabled = novo || edit;
            this.dateTimePickerHoraInicialSab.Enabled = novo || edit;
            this.dateTimePickerHoraFinalSab.Enabled = novo || edit;
            this.dateTimePickerHoraInicialDom.Enabled = novo || edit;
            this.dateTimePickerHoraFinalDom.Enabled = novo || edit;

            this.dataGridViewHorarios.Enabled = !novo && !edit;

            if (!haRows || novo)
            {
                this.textBoxControle.Text = "";
            }
            else {
                List<HorarioVO> horarioList = (List<HorarioVO>)this.dataGridViewHorarios.DataSource;
                HorarioVO horario = horarioList[this.dataGridViewHorarios.CurrentRow.Index];
                this.textBoxID.Text = horario.idHorario.ToString();
                this.textBoxControle.Text = horario.controle;
                this.comboBoxTipoPeriodo.SelectedValue = horario.tipoPeriodo;

                this.dateTimePickerHoraInicial.Value = DateTime.Today.AddTicks(horario.horaInicial.Ticks);
                this.dateTimePickerHoraFinal.Value = DateTime.Today.AddTicks(horario.horaFinal.Ticks);
                this.dateTimePickerHoraInicialDiaria.Value = DateTime.Today.AddTicks(horario.horaInicialDiaria.Ticks);
                this.dateTimePickerHoraFinalDiaria.Value = DateTime.Today.AddTicks(horario.horaFinalDiaria.Ticks);
                this.dateTimePickerHoraInicialSab.Value = DateTime.Today.AddTicks(horario.horaInicialSab.Ticks);
                this.dateTimePickerHoraFinalSab.Value = DateTime.Today.AddTicks(horario.horaFinalSab.Ticks);
                this.dateTimePickerHoraInicialDom.Value = DateTime.Today.AddTicks(horario.horaInicialDom.Ticks);
                this.dateTimePickerHoraFinalDom.Value = DateTime.Today.AddTicks(horario.horaFinalDom.Ticks);
            }
            if (novo || edit){
                this.textBoxControle.Focus();
            }
        }

        private void buttonListagem_Click(object sender, EventArgs e)
        {
            FormReportHorario formx = new FormReportHorario();
            formx.MdiParent = this.MdiParent;
            formx.Show();
        }

     }
}
